# -*- coding: utf-8 -*-
'''
@author: Ricardo Faria 6315 e Luis Freitas 5602
Classe onde sao efetuadas as consultas
'''
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import DB
import csv
from decimal import *

#lista de distritos para comparar com os items da tabela
distritos = ['Açores','Madeira' ,'Algarve','Beja', 'Setúbal', 'Évora', 'Lisboa', 'Santarém', 'Portalegre','Leiria', 'Castelo Branco', 'Coimbra', 'Aveiro', 'Viseu', 'Guarda', 'Porto', 'Braga', 'Viana', 'Vila Real', 'Bragança']
#distritos a ser guardados no ficheiro csv
distritos_finais = ['Acores','Madeira' ,'Algarve','Beja', 'Setubal', 'Evora', 'Lisboa', 'Santarem', 'Portalegre','Leiria', 'Castelo Branco', 'Coimbra', 'Aveiro', 'Viseu', 'Guarda', 'Porto', 'Braga', 'Viana', 'Vila Real', 'Braganca']
lista_all_items = []

def ler_items_bd():
    '''
    Método que nos permite obter todos os items da tabela colocado
    '''
    engine = create_engine('sqlite:///Data.db')
    Session = sessionmaker(bind = engine)
    session = Session()
    try:
        for item in session.query(DB.Colocado):
            lista_all_items.append(item)
    except:
        ""
    return lista_all_items
lista_all_items = ler_items_bd()#lista com todos os items da tabela colocado

'''
Método que conta os colodados por instituiçao
Compara uma lista de items repetidos com outra lista de items nao repetidos
para calcular o colocados em cada instituicao
@return colocados: Lista com os nrs de colocados de cada instituicao
@return lista_nao_repetida: lista com os nomes das instituicoes nao repetidos
para porteriormente guardar no ficheiro
'''
def colocados_instituicao():
    lista_nao_repetida = [] #lista para posteriormente guardar
    colocados = [] #lista com os valores dos colocados de cada instituicao
    '''
    Ciclo que permite adquirir lista sem repetiçoes de instituição
    '''
    for item in lista_all_items:
        if item.cod_instituicao not in lista_nao_repetida:
            lista_nao_repetida.append(item.cod_instituicao)
    '''
    Ciclo que compara as lista e calcula os valores dos colocados
    '''
    for el in lista_nao_repetida:
        conta_colocados = 0
        for x in range (0, len(lista_all_items)):
            if el == lista_all_items[x].cod_instituicao:
                conta_colocados += int(float(lista_all_items[x].colocados))
        colocados.append(conta_colocados)
    escrever_csv(lista_nao_repetida, colocados, "colocados instituicao")
    return colocados, lista_nao_repetida
  
def colocados_distrito():
    '''
    Método que conta os colodados por distrito
    Compara uma lista de items repetidos com outra lista de items nao repetidos
    para calcular o colocados em cada distrito
    @return valor_distritos: valor de colocados em cada distrito
    @return total_colocados: variavel que contem o valor total de colocados
    
    NOTA IMPORTANTE: este total_colocados nao contem os elementos colocados na universidade
    da escola superior nautica. Apenas foi trabalhado com as instituicoes que no seu nome
    contêm um distrito identificavel de acordo com a nossa lista
    '''
    valor_distritos =[]#variavel onde se irá guardar os colocados de cada distrito
    total_colocados = 0    
    i=0
    for distrito in distritos:
        '''
        Ciclo que verifica cada distrito, comparando-o todos os items e efetuando
        assim a contagem para cada distrito
        '''
        conta_distrito = 0
        for x in range (0, len(lista_all_items)):
            if  distrito in lista_all_items[x].nome_instituicao.encode('utf-8'):
                conta_distrito += int(float(lista_all_items[x].colocados))
            
        csv_write = [distritos_finais[i], conta_distrito]
        i+=1
        valor_distritos.append(conta_distrito)
        total_colocados += conta_distrito
    escrever_csv(distritos_finais, valor_distritos, "colocados distrito")
    return valor_distritos, total_colocados
    

def permilagem_distrito():
    '''
    Método que calcula a permilagem de colocados em cada distrito
    (de acordo com os nossos elementos utilizados)
    através do valor de cada distrito e o total de todos os distritos
    é efetuado o calculo
    '''
    valor_distritos, total_colocados = colocados_distrito()
    #valor distritos - lista com os colocados de cada distrito
    #total_colocados - Número utilizado para efetuar o calculo
    #                  de acordo com os nosso elementos utilizados
    i = 0
    for element in valor_distritos:
        
        nr = float(element * 1000)
        nr = float(nr / total_colocados)
        valor_distritos[i] = nr
        i+=1
    escrever_csv(distritos_finais, valor_distritos, "permilagem distrito")

def percentagem_instituicao():
    '''
    Método que calcula a percentagem de colocados por cada instituicao
    através do valor de cada instituicao e o total de todos os colocados
    é efetuado o calculo
    '''
    i = 0
    colocados, lista_nao_repetida = colocados_instituicao()
    total_colocados = 37415# disponibilizado no xls
    for element in colocados:  
        nr = float(element * 100)
        nr = float(nr / total_colocados)
        colocados[i] = nr
        i+=1
    escrever_csv(lista_nao_repetida, colocados, "percentagem instituicao")
       
def sobras_instituicao():
    '''
    Método que contar as vagas sobrantes de cada instituicao
    O funcionamento do método é igual ao colocados_instituicao()
    apenas alterando o elemento em contagem
    '''
    none, lista_nao_repetida = colocados_instituicao()
    sobras = []#lista onde serao guardados os valores de sobras de cada instituicao
    for el in lista_nao_repetida:
        conta_sobras = 0
        for x in range (0, len(lista_all_items)):
            if el == lista_all_items[x].cod_instituicao:
                conta_sobras += int(float(lista_all_items[x].vagas_sobrantes))    

        sobras.append(conta_sobras)
    escrever_csv(lista_nao_repetida, sobras, "sobras instituicao")

def sobras_distrito():
    '''
    Método que contar as vagas sobrantes de cada distrito
    O funcionamento do método é igual ao colocados_distrito()
    apenas alterando o elemento em contagem
    '''
    sobras = []#lista onde serao guardados os valores de sobras de cada instituicao
    i=0
    for distrito in distritos:
        sobras_distrito = 0
        for x in range (0, len(lista_all_items)):
            if  distrito in lista_all_items[x].nome_instituicao.encode('utf-8'):
                sobras_distrito += int(float(lista_all_items[x].vagas_sobrantes))

        sobras.append(sobras_distrito)    
    escrever_csv(distritos_finais, sobras, "sobras distrito")
    
def escrever_csv(lista_etiquetas, lista_valores, nome_ficheiro):
    '''
    Método que escreve no csv duas listas
    @param lista_etiquetas: "Etiqueta" para o valor correspondente
    @param lista_valores: Valores a ser enviados de acordo com etiqueta
    @param nome_ficheiro: nome do ficheiro a ser guardado
    '''
    c = csv.writer(open(nome_ficheiro, "wb"))
    csv_write = [] #elementos a escrever no csv
    for x in range(0, len(lista_etiquetas)):
        csv_write = [lista_etiquetas[x].encode('utf-8'), lista_valores[x]]
        c.writerow(csv_write)
        
    
